$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

C++
C#

Збирови префикса и разлике суседних елемената низа

Ако је дат низ елемената збир свих елемената у интервалу позиција \([a, b]\) се може израчунати као разлика између збира свих елемената у интервалу позиција \([0, b]\) и збира елемената у интервалу позиција \([0, a-1]\).

На пример, размотримо како да израчунамо збир елемената на позицијама из интервала [3, 5] (тј. на позицијама 3, 4 и 5) у низу 4, 2, 3, 1, 5, 6, 9, 2. На тим позицијама се налазе елементи 1, 5 и 6 и збир им је \(1+5+6 = 12\). Збир свих елемената из интевала позиција \([0, 5]\) је \(4+2+3+1+5+6 = 21\), док је збир свих елемената из интервала позиција \([0, 2]\) једнак \(4 + 2 + 3 = 9\). Разлика \(21-9\) управо је једнака 12.

Ова наизглед веома једноставна особина сабирања може значајно помоћи убрзању разних алгоритама у којима су нам потребни збирови узастопних елемената низа. Наиме, ако знамо збирове свих префикса низа тј. збирове на свим интервалима \([0, k)\), за \(k=0\) до \(n\) (а њих можемо израчунати током фазе претпроцесирања, инкрементално, у линеарној сложености), тада у константној сложености (једним одузимањем) можемо израчунати збир произвољног сегмента низа.

У језику C++ парцијалне збирове је могуће израчунати и коришћењем библиотечке функције partial_sum, која, наравно, ради у линеарној сложености. Функцији се прослеђују два итератора на део низа који се сабира, као и итератор на почетак низа у који се смештају резултати (пошто се унапред зна колико ће елемената бити, тај низ се унапред алоцира).

Дакле, од датог низа, низ збирова префикса можемо израчунати у линеарној сложености, али важи и обратно. Од низа префикса, у линеарној сложености можемо израчунати елементе оригиналног низа. Важи чак и јаче тврђење од тога, јер сваки конкретни елемент низа можемо наћи у константној сложености, одузимањем два суседна збира префикса. Дакле, прелазак са низа на збирове његових префикса можемо сматрати променом репрезентације (нема смисла чувати и једно и друго истовремено у меморији).

Приметимо огромну сличност са интегралним и диференцијалним рачуном. Израчунавање збирова префикса одговара одређеном интеграљењу, разлика збирова префикса одговара Њутн-Лајбницовој формули, док израчунавање разлике суседних елемената одговара диференцирању. Интеграљење и диференцирање су међусобно инверзне операције.

Дуалан приступ збировима префикса је промена репрезентације у којој уместо низа чувамо разлике суседних елемената. Повратак на оргинални низ се онда може извршити у линеарној сложености тако што израчунамо збирове префикса низа разлика. Ова репрезентација нам омогућава да веома ефикасно мењамо сегменте низа тако што све елементе из неког задатог сегмента увећамо или умањимо за неку фиксну вредност.

Збирови префикса и разлике суседних елемената низа

Ако је дат низ елемената збир свих елемената у интервалу позиција \([a, b]\) се може израчунати као разлика између збира свих елемената у интервалу позиција \([0, b]\) и збира елемената у интервалу позиција \([0, a-1]\).

На пример, размотримо како да израчунамо збир елемената на позицијама из интервала [3, 5] (тј. на позицијама 3, 4 и 5) у низу 4, 2, 3, 1, 5, 6, 9, 2. На тим позицијама се налазе елементи 1, 5 и 6 и збир им је \(1+5+6 = 12\). Збир свих елемената из интевала позиција \([0, 5]\) је \(4+2+3+1+5+6 = 21\), док је збир свих елемената из интервала позиција \([0, 2]\) једнак \(4 + 2 + 3 = 9\). Разлика \(21-9\) управо је једнака 12.

Ова наизглед веома једноставна особина сабирања може значајно помоћи убрзању разних алгоритама у којима су нам потребни збирови узастопних елемената низа. Наиме, ако знамо збирове свих префикса низа тј. збирове на свим интервалима \([0, k)\), за \(k=0\) до \(n\) (а њих можемо израчунати током фазе претпроцесирања, инкрементално, у линеарној сложености), тада у константној сложености (једним одузимањем) можемо израчунати збир произвољног сегмента низа.

Дакле, од датог низа, низ збирова префикса можемо израчунати у линеарној сложености, али важи и обратно. Од низа префикса, у линеарној сложености можемо израчунати елементе оригиналног низа. Важи чак и јаче тврђење од тога, јер сваки конкретни елемент низа можемо наћи у константној сложености, одузимањем два суседна збира префикса. Дакле, прелазак са низа на збирове његових префикса можемо сматрати променом репрезентације (нема смисла чувати и једно и друго истовремено у меморији).

Приметимо огромну сличност са интегралним и диференцијалним рачуном. Израчунавање збирова префикса одговара одређеном интеграљењу, разлика збирова префикса одговара Њутн-Лајбницовој формули, док израчунавање разлике суседних елемената одговара диференцирању. Интеграљење и диференцирање су међусобно инверзне операције.

Дуалан приступ збировима префикса је промена репрезентације у којој уместо низа чувамо разлике суседних елемената. Повратак на оргинални низ се онда може извршити у линеарној сложености тако што израчунамо збирове префикса низа разлика. Ова репрезентација нам омогућава да веома ефикасно мењамо сегменте низа тако што све елементе из неког задатог сегмента увећамо или умањимо за неку фиксну вредност.

Збирови префикса и разлике суседних елемената низа — zadaci

Аритметички троугао

Za ovaj zadatak možete videti rešenje
pokušalo: 152, rešilo: 73%

Збирови сегмената

pokušalo: 627, rešilo: 91%

Максимални збир сегмента

Za ovaj zadatak možete videti rešenje
pokušalo: 272, rešilo: 91%

Паметна куповина акција

pokušalo: 361, rešilo: 82%

Сегмент датог збира у низу целих бројева

pokušalo: 378, rešilo: 61%

Сегмент датог збира у низу природних бројева

Za ovaj zadatak možete videti rešenje
pokušalo: 276, rešilo: 46%

Кајмак

pokušalo: 147, rešilo: 71%

Број сегмената чији је збир дељив са k

Za ovaj zadatak možete videti rešenje
pokušalo: 307, rešilo: 82%

Слаткиши за сав новац

pokušalo: 425, rešilo: 65%

Кружни пут

Za ovaj zadatak možete videti rešenje
pokušalo: 85, rešilo: 70%

Збирови правоугаоника

Za ovaj zadatak možete videti rešenje
pokušalo: 244, rešilo: 80%

Пар производа у ранцу

Za ovaj zadatak možete videti rešenje
pokušalo: 236, rešilo: 73%

Попуњавање празнина

pokušalo: 186, rešilo: 76%

Збир подниза карата

pokušalo: 77, rešilo: 77%

Највећи НЗД низа након замене једног елемента

Za ovaj zadatak možete videti rešenje
pokušalo: 81, rešilo: 85%

Увећавање сегмената

Za ovaj zadatak možete videti rešenje
pokušalo: 213, rešilo: 93%

Најбројнији пресек интервала

pokušalo: 93, rešilo: 82%

Пермутација са највећим збиром упита

pokušalo: 119, rešilo: 69%